x86: IRQ fix incorrect logic in __clear_irq_vector
authorAndrew Cooper <andrew.cooper3@citrix.com>
Sat, 13 Aug 2011 09:14:28 +0000 (10:14 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Sat, 13 Aug 2011 09:14:28 +0000 (10:14 +0100)
commit1a9b16687d54c660c83c8d8554d7b08c3cec6895
treed7406b0966f12c358a7ce46df77f916187e5f79f
parentabe7415dd94258648d5a505bce54b7de75b989c3
x86: IRQ fix incorrect logic in __clear_irq_vector

In the old code, tmp_mask is the cpu_and of cfg->cpu_mask and
cpu_online_map.  However, in the usual case of moving an IRQ from one
PCPU to another because the scheduler decides its a good idea,
cfg->cpu_mask and cfg->old_cpu_mask do not intersect.  This causes the
old cpu vector_irq table to keep the irq reference when it shouldn't.

This leads to a resource leak if a domain is shut down wile an irq has
a move pending, which results in Xen's create_irq() eventually failing
with -ENOSPC when all vector_irq tables are full of stale references.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/irq.c